const vscode = require('vscode');
const RandExp = require('randexp');
const 正则工具 = require("regulex");
import { languages, window, ExtensionContext, Hover } from 'vscode';


export function activate(context: ExtensionContext) {

    // 注册hover提供器
    context.subscriptions.push(languages.registerHoverProvider({
        pattern: '**',
    }, {
        provideHover: () => {
            const 翻译结果 = 举例(取选中文本())
            return new Hover(翻译结果)
        }
    }))
    console.log('注册完毕')
}

function 取选中文本(): string {
    const 当前编辑器 = window.activeTextEditor;
    if (当前编辑器) {
        const 选中部分 = 当前编辑器.selection;
        return 当前编辑器.document.getText(选中部分);
    }
    return ""
}

function 举例(文本: string): string {
    const 结果模版 = new vscode.MarkdownString();
    结果模版.appendText(`正则表达式：` + 文本 + `\n`)
    结果模版.appendText(`序列：\n`)
    var 解析 = 正则工具.parse
    var re = new RegExp(文本);

    for (var 片段 of 生成描述(解析(re.source).tree)) {
        结果模版.appendMarkdown(`- ` + 片段 + '\n')
    }
    结果模版.appendText(`\n例子：`)
    const randexp = new RandExp(文本)
    randexp.max = 0;
    结果模版.appendText(randexp.gen())
    return 结果模版
}

function 生成描述(语法树: any): string[] {
    const 描述: string[] = [];
    for (var 片段 of 语法树) {
        let 片段描述 = ``
        if (片段['type'] == 'exact') {
            片段描述 += 片段['chars']
        } else if (片段['type'] == 'charset') {
            片段描述 += 片段['ranges']
        }
        if ('repeat' in 片段) {
            if (片段['repeat']['max'] == null || 片段['repeat']['max'] == 1/0 ) {
                片段描述 += ' 若干'
            } else {
                片段描述 += ' 最多' + 片段['repeat']['max'] + '个'
            }
        }
        描述.push(片段描述)
    }
    return 描述
}

// This method is called when your extension is deactivated
export function deactivate() { }
